package com.github.cakin.shiro.chapter21.service;

import com.github.cakin.shiro.chapter21.entity.Role;
import com.github.cakin.shiro.chapter21.dao.RoleDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * @className: RoleService
 * @description: 角色服务
 * @date: 2020/5/26
 * @author: cakin
 */
@Service
public class RoleServiceImpl implements RoleService {
    /**
     * 注入角色Dao
     */
    @Autowired
    private RoleDao roleDao;
    /**
     * 注入resourceService
     */
    @Autowired
    private ResourceService resourceService;

    /**
     * 功能描述：创建角色
     *
     * @param role 角色
     * @return Role
     * @author cakin
     * @date 2020/5/26
     */
    public Role createRole( Role role ) {
        return roleDao.createRole(role);

    }

    /**
     * 功能描述：更新角色
     *
     * @param role 角色
     * @return Role
     * @author cakin
     * @date 2020/5/26
     */
    public Role updateRole( Role role ) {
        return roleDao.updateRole(role);
    }

    /**
     * 功能描述：根据角色I删除角色
     *
     * @param roleId 角色Id
     * @author cakin
     * @date 2020/5/26
     */
    public void deleteRole( Long roleId ) {
        roleDao.deleteRole(roleId);
    }

    /**
     * 功能描述：根据角色Id查找角色角色
     *
     * @param roleId 角色Id
     * @return Role
     * @author cakin
     * @date 2020/5/26
     */
    public Role findOne( Long roleId ) {
        return roleDao.findOne(roleId);
    }

    /**
     * 功能描述：角色列表
     *
     * @return Role
     * @author cakin
     * @date 2020/5/26
     */
    public List<Role> findAll() {
        return roleDao.findAll();
    }

    /**
     * 根据角色编号得到角色标识符列表
     *
     * @param roleIds 角色编号
     * @return Set<String> 标识符标识符列表
     * @author cakin
     * @date 2020/5/26
     */
    public Set<String> findRoles( Long... roleIds ) {
        Set<String> roles = new HashSet<String>();
        for (Long roleId : roleIds) {
            Role role = findOne(roleId);
            if (role != null) {
                roles.add(role.getRole());
            }
        }
        return roles;
    }

    /**
     * 根据角色编号得到权限字符串列表
     *
     * @param roleIds 角色编号
     * @return Set<String> 权限字符串列表
     */
    public Set<String> findPermissions( Long[] roleIds ) {
        Set<Long> resourceIds = new HashSet<Long>();
        for (Long roleId : roleIds) {
            Role role = findOne(roleId);
            if (role != null) {
                resourceIds.addAll(role.getResourceIds());
            }
        }
        return resourceService.findPermissions(resourceIds);
    }
}
